using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;

namespace HOPE
{
    public static class VirtualThumbsticks
    {
        #region fields

        //jarak pada layar yang merepresentasikan nilai dari thumbstick value = 1f
        private const float maxThumbstickDistance = 60f;
        
        //penanda dimana letak titik sentuhnya
        private static Vector2 leftPosition;
        private static Vector2 rightPosition;

        //ID penanda letak titik sentuhnya
        private static int leftId = -1;
        private static int rightId = -1;

        //get posisi tengah dari thumbstick kiri
        public static Vector2? LeftThumbstickCenter { get; private set; }

        //get posisi tengah dari thumbstick kanan
        public static Vector2? RightThumbstickCenter { get; private set; }
        #endregion

        #region ambil nilai kiri dan kanan
        //mengambil nilai dari left thumbstick
        public static Vector2 LeftThumbstick
        {
            get
            {

                //jika tidak ada nilai dari left thumbstick, maka nilai dikembalikan ke (0, 0)
                if (!LeftThumbstickCenter.HasValue)
                    return Vector2.Zero;

                //membandingkan nilai vektor dari posisi tersentuh ke center
                //dibandingkan dengan jarak maximum thumbstick
                Vector2 l = (leftPosition - LeftThumbstickCenter.Value) / maxThumbstickDistance;

                //jika nilai jarak lebih dari 1, vektor di normalkan kembali
                if (l.LengthSquared() > 1f)
                    l.Normalize();

                return l;
            }
        }

        //mengambil nilai dari right thumbstick
        public static Vector2 RightThumbstick
        {
            get
            {
                //jika tidak ada nilai dari right thumbstick, maka nilai dikembalikan ke (0, 0)
                if (!RightThumbstickCenter.HasValue)
                    return Vector2.Zero;

                //membandingkan nilai vektor dari posisi tersentuh ke center
                //dibandingkan dengan jarak maximum thumbstick
                Vector2 r = (rightPosition - RightThumbstickCenter.Value) / maxThumbstickDistance;

                //jika nilai jarak lebih dari 1, vektor di normalkan kembali
                if (r.LengthSquared() > 1f)
                    r.Normalize();

                return r;
            }
        }
        #endregion

        #region update

        //update nilai dari virtual thumbstick berdasarkan letak sentuhan terakhir, hal ini harus diupdate tiap frame.
        public static void Update()
        {
            TouchLocation? leftTouch = null, rightTouch = null;
            TouchCollection touches = TouchPanel.GetState();

            //memeriksa semua sentuhan yang ada lalu dikonversikan kedalam posisi virtual dpadnya,
            //perhatikan bahwa "touches" adalah kumpulan dari semua sentuhan pada saat seketika
            //hanya informasi yang tepat yang akan kita akses sebagai lokasi terakhir dari setiap sentuhan
            foreach (var touch in touches)
            {
                if (touch.Id == leftId)
                {
                    //ini adalah gerakan dari left-stick touch yang telah kita tracking
                    leftTouch = touch;
                    continue;
                }
                if (touch.Id == rightId)
                {
                    //ini adalah gerakan dari right-stick touch yang telah kita tracking
                    rightTouch = touch;
                    continue;
                }

                //kita tidak akan melanjutkan gesture thumbstick yang ada, kita membuat yang baru lagi
                //kita akan menggunakan posisi sentuhan terakhir untuk mendapatkan letak sedekat mungkin
                //dimana letak awal gesture sebenarnya

                TouchLocation earliestTouch;
                if (!touch.TryGetPreviousLocation(out earliestTouch))
                    earliestTouch = touch;

                if (leftId == -1)
                {
                    //jika kita tidak sedang tracking left thumbstick, tapi touch-nya ada di
                    //setengah dari kiri layar, kita mulai untuk tracking touch ini sebagai left stick kita

                    if (earliestTouch.Position.X < TouchPanel.DisplayWidth / 2)
                    {
                        leftTouch = earliestTouch;
                        continue;
                    }
                }

                if (rightId == -1)
                {
                    //jika kita tidak sedang tracking right thumbstick, tapi touch-nya ada di
                    //setengah dari kanan layar, kita mulai untuk tracking touch ini sebagai right stick kita

                    if (earliestTouch.Position.X < TouchPanel.DisplayWidth / 2)
                    {
                        rightTouch = earliestTouch;
                        continue;
                    }
                }
            }

            //jika kita punya left touch

            if (leftTouch.HasValue)
            {
                //kalo ga ada centernya, posisi yang tersentuh kita jadikan centernya
                if (!LeftThumbstickCenter.HasValue)
                    LeftThumbstickCenter = leftTouch.Value.Position;

                //menyimpan letak touch-nya
                leftPosition = leftTouch.Value.Position;

                //menyimpan ID dari touch-nya
                leftId = leftTouch.Value.Id;
            }
            else
            {
                //kalo tidak, kita coba reset nilai kita untuk tidak nge-tracking sentuhan apapun
                //untuk left thumbstick
                LeftThumbstickCenter = null;
                leftId = -1;
            }

            // jika kita punya right touch
            if (rightTouch.HasValue)
            {
                //kalo ga ada center, kita jadikan posisi sentuhannya sebagai center
                if (!RightThumbstickCenter.HasValue)
                    RightThumbstickCenter = rightTouch.Value.Position;

                //simpan letak sentuhannya
                rightPosition = rightTouch.Value.Position;

                //simpan ID sentuhannya
                rightId = rightTouch.Value.Id;
            }
            else
            {
                //kita reset nilai pusatnya,agar dia tidak nge-tracking sentuhan apapun
                //untuk right thumbstick
                RightThumbstickCenter = null;
                rightId = -1;
            }
        }
        #endregion
    }
}

            